
from pydantic import BaseModel

BULTER_SYSTEM_MESSAGE = ""


# 用于收集任务相关事实的预调查提示词：引导分析任务中给定的事实、需要查找的事实、需要推导的事实及基于记忆的推
BULTER_TASK_LEDGER_FACTS_PROMPT_ZH = """
以下我将向您展示一个请求。在开始处理该请求之前，请尽您所能回答以下预调查问题。
请记住，您在 trivia（冷知识）方面达到 Ken Jennings（知名益智竞赛冠军）水平，在谜题解决方面达到门萨（高智商协会）水平，因此您有深厚的知识储备可供调用。

这是请求内容：

{task}

这是预调查问题：

    1. 请列出请求本身中明确给出的任何具体事实或数据（可能不存在）。
    2. 请列出可能需要查找的事实，并明确说明**具体可在哪里找到**（某些情况下，请求中可能已提及权威来源）。
    3. 请列出可能需要通过推导得出的事实（例如通过逻辑推理、模拟或计算）。
    4. 请列出基于记忆、直觉或合理猜测的事实。

回答此调查时，请记住“事实”通常指具体名称、日期、统计数据等。您的回答应使用以下标题：

    1. 给定或已验证的事实
    2. 需要查找的事实
    3. 需要推导的事实
    4. 合理猜测

您的回答中**不得包含其他标题或部分**，在被要求前**不得列出下一步计划**。
"""
# 任务计划生成提示词：基于团队组成和已知/未知事实，生成解决原始请求的简短要点计划
BULTER_TASK_LEDGER_PLAN_PROMPT_ZH = """太棒了。为处理此请求，我们已组建以下团队：

{team}

请根据团队构成以及已知和未知的事实，制定一个简短的要点计划来解决原始请求。请记住，无需让所有团队成员都参与 —— 此任务可能不需要某位团队成员的特定专业知识。

"""

# 完整任务信息提示词：整合用户请求、团队信息、初始事实表和执行计划，提供完整上下文
BULTER_TASK_LEDGER_FULL_PROMPT = """
我们要处理以下用户请求：

{task}

为了回答这个请求，我们组建了以下团队：

{team}

以下是初始事实表：

{facts}

以下是我们要遵循的计划：

{plan}

"""


# 进度评估提示词：引导评估任务完成状态、循环检测、进展情况，并确定下一步发言人及指令（要求输出严格JSON格式）
BULTER_PROGRESS_LEDGER_PROMPT_ZH ="""
请回忆我们正在处理的以下请求：

{task}

我们已组建以下团队：

{team}

为推动请求进展，请回答以下问题（包括必要的推理）：

    - 请求是否已完全满足？（若已完成则为True，若原始请求尚未成功且完全解决则为False）
    - 我们是否处于循环中（重复相同的请求和/或收到相同的响应）？循环可能跨越多个回合，可能包括重复滚动等操作（如多次上下滚动超过少数几次）。
    - 我们是否在取得进展？（若刚开始或近期消息有新增价值则为True；若近期消息显示陷入循环或存在重大障碍（如无法读取所需文件）则为False）
    - 下一位发言者应是谁？（从以下名单中选择：{names}）
    - 您会向该团队成员发出什么指令或问题？（直接对其发言，包含其可能需要的具体信息）

请根据以下模式以纯JSON格式输出答案。JSON对象必须可直接解析。请勿输出JSON以外的内容，且严格遵循此模式：

    {{
       "is_request_satisfied": {{
            "reason": string,
            "answer": boolean
        }},
        "is_in_loop": {{
            "reason": string,
            "answer": boolean
        }},
        "is_progress_being_made": {{
            "reason": string,
            "answer": boolean
        }},
        "next_speaker": {{
            "reason": string,
            "answer": string (必须从{names}中选择)
        }},
        "instruction_or_question": {{
            "reason": string,
            "answer": string
        }}
    }}
"""
class LedgerEntryBooleanAnswer(BaseModel):
    reason: str
    answer: bool


class LedgerEntryStringAnswer(BaseModel):
    reason: str
    answer: str


class LedgerEntry(BaseModel):
    is_request_satisfied: LedgerEntryBooleanAnswer
    is_in_loop: LedgerEntryBooleanAnswer
    is_progress_being_made: LedgerEntryBooleanAnswer
    next_speaker: LedgerEntryStringAnswer
    instruction_or_question: LedgerEntryStringAnswer


# 事实表更新提示词：当进展受阻时，基于新信息更新事实表（包括修正推测、补充新事实等）
BULTER_TASK_LEDGER_FACTS_UPDATE_PROMPT = """As a reminder, we are working to solve the following task:

{task}

It's clear we aren't making as much progress as we would like, but we may have learned something new. Please rewrite the following fact sheet, updating it to include anything new we have learned that may be helpful. Example edits can include (but are not limited to) adding new guesses, moving educated guesses to verified facts if appropriate, etc. Updates may be made to any section of the fact sheet, and more than one section of the fact sheet can be edited. This is an especially good time to update educated guesses, so please at least add or update one educated guess or hunch, and explain your reasoning.

Here is the old fact sheet:

{facts}
"""

BULTER_TASK_LEDGER_FACTS_UPDATE_PROMPT_ZH = """提醒：我们正在努力解决以下任务：

{task}

显然，我们的进展不如预期，但可能已学到新信息。请重写以下事实表，更新以包含我们学到的可能有用的新信息。示例修改可包括（但不限于）添加新猜测、将合理推测转为已验证事实（若适用）等。可对事实表任意部分进行更新，且可编辑多个部分。这是更新合理推测的绝佳时机，请至少添加或更新一个合理推测或直觉，并解释您的推理。

以下是旧事实表：

{facts}"""

# 计划更新提示词：分析上次执行失败的根本原因，生成新的简明要点计划以避免重复错误
BULTER_TASK_LEDGER_PLAN_UPDATE_PROMPT = """请简要解释上一次运行中出现的问题（失败的根本原因），然后制定一个新计划，该计划应包含克服先前挑战的步骤和/或提示，尤其要避免重复相同的错误。与之前一样，新计划应简洁明了，以要点形式呈现，并考虑以下团队组成（请勿涉及其他外部人员，因为我们无法联系到其他人）：

{team}

"""
# 最终答案生成提示词：基于对话记录，生成面向用户的任务最终解答
BULTER_FINAL_ANSWER_PROMPT = """
We are working on the following task:
{task}

We have completed the task.

The above messages contain the conversation that took place to complete the task.

Based on the information gathered, provide the final answer to the original request.
The answer should be phrased as if you were speaking to the user.
"""

# 最终答案生成提示词：基于对话记录，生成面向用户的任务最终解答
BULTER_FINAL_ANSWER_PROMPT_ZH = """
我们正在处理以下任务：
{task}

我们已经完成了该任务。

上述消息包含了完成任务过程中的对话记录。

根据收集到的信息，请提供原始请求的最终答案。
回答应采用直接与用户对话的语气。
"""

